/**
 * 数据库初始化和设置脚本
 * 执行方式: node db_setup.js
 */

const mysql = require('mysql2/promise');
const dotenv = require('dotenv');
const path = require('path');
const fs = require('fs');

// 加载环境变量
dotenv.config({ path: path.join(__dirname, '..', '.env') });

// 数据库连接配置
const dbConfig = {
  host: process.env.DB_HOST || 'localhost',
  user: process.env.DB_USER || 'root',
  password: process.env.DB_PASSWORD || '',
  database: process.env.DB_NAME || 'nonghi_db',
  port: process.env.DB_PORT || 3306,
  waitForConnections: true,
  connectionLimit: 10,
  queueLimit: 0
};

// 读取SQL定义文件
function readSqlFile(filename) {
  const filePath = path.join(__dirname, 'tables', filename);
  return fs.readFileSync(filePath, 'utf8');
}

// 主函数
async function setupDatabase() {
  let connection;
  
  try {
    // 创建不含数据库名的连接
    connection = await mysql.createConnection({
      host: dbConfig.host,
      user: dbConfig.user,
      password: dbConfig.password,
      port: dbConfig.port
    });
    
    console.log('成功连接数据库服务器');

    // 创建数据库
    await connection.query(`CREATE DATABASE IF NOT EXISTS \`${dbConfig.database}\` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci`);
    console.log(`成功创建数据库: ${dbConfig.database}`);
    
    // 切换到新数据库
    await connection.query(`USE \`${dbConfig.database}\``);
    
    // 读取并执行SQL定义文件
    const usersSql = readSqlFile('users.sql');
    await connection.query(usersSql);
    console.log('用户表和诊断历史表创建成功');
    
    // 创建植物疾病信息表
    await connection.query(`
      CREATE TABLE IF NOT EXISTS \`plant_diseases\` (
        \`id\` INT PRIMARY KEY AUTO_INCREMENT,
        \`plant_name\` VARCHAR(100) NOT NULL COMMENT '植物名称',
        \`disease_name\` VARCHAR(255) NOT NULL COMMENT '疾病名称',
        \`symptoms\` TEXT COMMENT '症状描述',
        \`causes\` TEXT COMMENT '病因',
        \`treatment\` TEXT COMMENT '处理方法',
        \`prevention\` TEXT COMMENT '预防措施',
        \`image_url\` TEXT COMMENT '示例图片',
        \`created_at\` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        \`updated_at\` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
        INDEX \`idx_plant_name\` (\`plant_name\`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
    `);
    console.log('成功创建植物疾病信息表');
    
    // 检查是否已有样本数据
    const [existingRows] = await connection.query('SELECT COUNT(*) as count FROM plant_diseases');
    
    if (existingRows[0].count === 0) {
      console.log('插入植物疾病示例数据...');
      // 插入植物疾病示例数据
      const sampleData = [
        {
          plant_name: '水稻',
          disease_name: '稻瘟病',
          symptoms: '叶片和茎秆上形成椭圆形或菱形的褐斑，中间灰白色，边缘褐色。严重时整个叶片枯死。',
          causes: '由稻瘟病菌(Magnaporthe grisea)引起，潮湿高温条件下易发病。',
          treatment: '1. 喷洒杀菌剂如三唑酮或咪鲜胺；2. 防治要及早进行，发病初期效果最好；3. 严重地块应连续喷药2-3次，间隔7天左右。',
          prevention: '1. 种植抗病品种；2. 均衡施肥，避免过量施用氮肥；3. 合理灌溉排水，降低田间湿度；4. 做好种子消毒处理。'
        },
        {
          plant_name: '小麦',
          disease_name: '白粉病',
          symptoms: '叶片、叶鞘、茎杆和穗上出现白色粉状物，随后变为灰白色或灰褐色，严重时整片叶子失绿枯死。',
          causes: '由小麦白粉病菌(Blumeria graminis f.sp. tritici)引起，温暖湿润环境有利于发病。',
          treatment: '1. 喷施三唑酮、腈菌唑等杀菌剂；2. 发病初期施药效果最佳；3. 按照7-10天的间隔连续防治。',
          prevention: '1. 选用抗病品种；2. 合理密植；3. 科学施肥；4. 清除田间病残体；5. 轮作倒茬。'
        },
        // ...更多示例数据
      ];
      
      for (const disease of sampleData) {
        await connection.query(
          'INSERT INTO plant_diseases (plant_name, disease_name, symptoms, causes, treatment, prevention) VALUES (?, ?, ?, ?, ?, ?)',
          [disease.plant_name, disease.disease_name, disease.symptoms, disease.causes, disease.treatment, disease.prevention]
        );
      }
      console.log(`成功插入${sampleData.length}条植物疾病示例数据`);
    } else {
      console.log('植物疾病表中已有数据，跳过示例数据插入');
    }
    
    console.log('数据库初始化完成！');
  } catch (err) {
    console.error('数据库设置过程中出错:', err);
    throw err;
  } finally {
    if (connection) {
      await connection.end();
      console.log('数据库连接已关闭');
    }
  }
}

// 执行设置
setupDatabase()
  .then(() => {
    console.log('数据库设置成功，程序退出');
    process.exit(0);
  })
  .catch((err) => {
    console.error('数据库设置失败:', err);
    process.exit(1);
  });
